home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-05-26 | 51.0 KB | 1,708 lines |
- *!*****************************************************************************
- *!
- *! Function: MIGDB4.PRG
- *! (c) Microsoft Corp. 1994, 1995
- *!
- *! Migrates DB-IV LBL, FRM and SCR files to FoxPro equivalents
- *!
- *! Parameter: csrcfile C fully qualified file to convert
- *! oConv O ForeignConverter object
- *!
- *! Returns .T. if successful
- *! .F. if failed
- *!
- *! changes: modified version of FP 2.6 code
- *!
- *!*****************************************************************************
- *-FUNCTION migdb4
- PARAMETER m.csrcfile, m.oConv
-
- #INCLUDE "convert.h"
- #INCLUDE "migdb4.h"
-
-
- PRIVATE tempstr
- PRIVATE cFmtConverterClass
- cFmtConverterClass = "FmtConverter"
-
- PRIVATE oldexact
- m.oldexact = SET("EXACT")
- SET EXACT ON && For ascan()
-
- PRIVATE oldalias
- m.oldalias = ALIAS()
-
- PRIVATE m.fhandle, m.fsize
- m.fhandle = -1
- IF TYPE("m.csrcfile") <> "C"
- *- no parm passed
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
-
- m.fhandle = FOPEN(m.csrcfile, 2)
- IF m.fhandle = -1
- =falldown(E_NOOPEN_LOC + JustFName(UPPER(m.csrcfile)))
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
-
- *- get file size, and return pointer to top of file
- m.fsize = FSEEK(m.fhandle,0,2)
- =FSEEK(m.fhandle,0)
-
- PRIVATE m.rootname,m.cpathname, m.lretval
- m.rootname = JustStem(m.csrcfile)
-
- *- include original path for saving migrated forms (01/27/94 jd)
- m.cpathname = AddBS(JustPath(m.csrcfile)) && use AddBS -- smarter about the last directory separator (jd 03.24.96)
-
- IF LEFT(FREAD(m.fhandle,41),40) # "dBASE IV Generic Design File Version 1.0"
- IF UPPER(TRIM(JustExt(m.csrcfile)))$"LBL|FRM|FRX|LBX"
- PRIVATE listhere,m.nctr9, ctmpext
- =FCLOSE(m.fhandle)
-
- *- what kind of file are we dealing with?
- IF JUSTEXT(m.csrcfile) $ "LBL|LBX"
- m.cfext = ".LBX"
- m.cmext = ".LBT"
- ELSE
- m.cfext = ".FRX"
- m.cmext = ".FRT"
- ENDIF
-
- IF _DOS
- *- disguise this as an .FRX file
- COPY FILE (csrcfile) TO (m.cpathname + m.rootname + m.cfext)
- SET EXACT &oldexact
- RETURN .T.
- ENDIF
- FOR m.nctr9 = 1 TO 999
- IF !FILE(m.cpathname + rootname + '.' + RIGHT(STR(m.nctr9 + 1000,4),3))
- EXIT
- ENDIF
- NEXT
- IF m.nctr9 = 1000
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
- ctmpext = '.' + RIGHT(STR(m.nctr9 + 1000,4),3)
- *- save their old file
- RENAME (m.csrcfile) TO (m.cpathname + m.rootname + m.ctmpext)
- COPY FILE (m.cpathname + m.rootname + m.ctmpext) TO (m.csrcfile)
- gOTherm.SetTitle(C_THERMMSG10_LOC + LOWER(PARTIALFNAME(m.csrcfile,C_FILELEN)))
- DO (gTransport) WITH m.csrcfile,IIF(m.cfext = ".FRX",23,24),.F.,gAShowMe, m.gOTherm,m.csrcfile
- *- change the name to .FRX, and restore original filename
- DO CASE
- CASE FILE(m.cpathname + m.rootname + ".FPT")
- *- assume this means they converted
- *- assume this means they converted
- IF FILE(m.cpathname + m.rootname + m.cfext)
- ERASE (m.cpathname + m.rootname + m.cfext)
- ENDIF
- IF FILE(m.cpathname + m.rootname + m.cmext)
- ERASE (m.cpathname + m.rootname + m.cmext)
- ENDIF
- RENAME (m.cpathname + m.rootname + ".FPT") TO (m.cpathname + m.rootname + m.cmext)
- RENAME (m.csrcfile) TO (m.cpathname + m.rootname + m.cfext)
- RENAME (m.cpathname + m.rootname + m.ctmpext) TO (m.csrcfile)
- IF FILE(m.cpathname + m.rootname + ".TBK")
- ERASE (m.cpathname + m.rootname + ".TBK")
- ENDIF
- m.lretval = .T.
- CASE FILE(m.cpathname + m.rootname + m.cmext)
- *- assume this means they converted
- IF FILE(m.cpathname + m.rootname + m.ctmpext)
- ERASE (m.cpathname + m.rootname + m.ctmpext)
- ENDIF
- IF FILE(m.cpathname + m.rootname + ".TBK")
- ERASE (m.cpathname + m.rootname + ".TBK")
- ENDIF
- m.lretval = .T.
- OTHERWISE
- *- erase the copy we made
- IF FILE(m.csrcfile)
- ERASE (m.csrcfile)
- ENDIF
- RENAME (m.cpathname + m.rootname + m.ctmpext) TO (m.csrcfile)
- m.lretval = .F.
- ENDCASE
- SET EXACT &oldexact
- RETURN m.lretval
- ELSE
- IF !FILE(m.cpathname + m.rootname + ".FMT")
- *-=falldown(C_ERRNOFMT_LOC)
- =falldown("")
- ELSE
- =FCLOSE(m.fhandle)
- ******----> Use class instead of PRG.
- LOCAL oConvObject
-
- oConvObject = CREATE(cFmtConverterClass, @aParms)
- IF TYPE("oConvObject") # 'O'
- *- object was not created
- *-THIS.lHadError = .T.
- RETURN .F.
- ENDIF
-
- IF oConvObject.lHadError
- *- error creating SCX object:
- *- assume error has already been presented to user
- *THIS.lHadError = .T.
- RELEASE oConvObject
- RETURN
- ENDIF
-
- oConvObject.Converter()
-
- *- IF fmt2scxw(m.cpathname + m.rootname + ".FMT")
- IF oConvObject.lHadError
- SET EXACT &oldexact
- oConvObject = .NULL.
- RELEASE oConvObject
- RETURN .F.
- ENDIF
-
- RELEASE oConvObject
- SET EXACT &oldexact
- RETURN .T.
- ******---->
- ENDIF
- ENDIF
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
-
- PRIVATE m.filevers
- m.filevers = ASC(FREAD(m.fhandle,1))
- PRIVATE m.filetype
- m.filetype = ASC(FREAD(m.fhandle,1))
- IF m.filetype <> scr_type AND m.filetype <> lbl_type AND m.filetype <> frm_type
- =falldown(C_ERRFTYPE_LOC)
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
- =FSEEK(m.fhandle,13,1) && Skip 13 bytes.
- PRIVATE num_bands
- num_bands = ASC(FREAD(m.fhandle,1))
- PRIVATE m.targetname
- DO CASE
- CASE m.filetype = scr_type
- IF FILE(m.rootname+".SCX") AND NOT ok2nuke(m.rootname+".SCX")
- =FCLOSE(m.fhandle)
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
- m.targetname = m.cpathname + m.rootname + ".SCX"
- PRIVATE m.tempname
- m.tempname = SYS(3)
- SELECT SELECT(1)
- CREATE DBF (m.tempname) ;
- ( platform c(8), ;
- uniqueid c(10), ;
- timestamp n(10), ;
- objtype n(2), ;
- objcode n(3), ;
- name m, ;
- expr m, ;
- vpos n(7,3), ;
- hpos n(7,3), ;
- height n(7,3), ;
- width n(7,3), ;
- style n(2), ;
- picture m, ;
- order m, ;
- "unique" l, ;
- comment m, ;
- environ l, ;
- boxchar c( 1), ;
- fillchar c( 1), ;
- tag m(10), ;
- tag2 m(10), ;
- penred n(5), ;
- pengreen n(5), ;
- penblue n(5), ;
- fillred n(5), ;
- fillgreen n(5), ;
- fillblue n(5), ;
- pensize n(5), ;
- penpat n(5), ;
- fillpat n(5), ;
- fontface m, ;
- fontstyle n(3), ;
- fontsize n(3), ;
- mode n(3), ;
- ruler n(1), ;
- rulerlines n(1), ;
- grid l, ;
- gridv n(2), ;
- gridh n(2), ;
- scheme n(2), ;
- scheme2 n(2), ;
- colorpair c(8), ;
- lotype n(1), ;
- rangelo m, ;
- hitype n(1), ;
- rangehi m, ;
- whentype n(1), ;
- when m, ;
- validtype n(1), ;
- valid m, ;
- errortype n(1), ;
- error m, ;
- messtype n(1), ;
- message m, ;
- showtype n(1), ;
- show m, ;
- activtype n(1), ;
- activate m, ;
- deacttype n(1), ;
- deactivate m, ;
- proctype n(1), ;
- proccode m, ;
- setuptype n(1), ;
- setupcode m, ;
- float l, ;
- close l, ;
- minimize l, ;
- border n(1), ;
- shadow l, ;
- center l, ;
- refresh l, ;
- disabled l, ;
- scrollbar l, ;
- addalias l, ;
- tab l, ;
- initialval m, ;
- initialnum n(3), ;
- spacing n(6,3), ;
- curpos l ;
- )
- USE (m.tempname) ALIAS newfile
- APPEND BLANK
- REPLACE newfile.objtype WITH 1, ;
- newfile.objcode WITH 63 &&10
- *- new options added by JD for Wizards
- *- window title, float, centered, single border, + support for
- *- PG UP & PG DN
- *- add color scheme (02/08/94 jd)
- REPLACE newfile.style WITH 2,;
- newfile.tag WITH '"' + PROPER(JustStem(m.csrcfile)) + '"',;
- newfile.gridv WITH 1,;
- newfile.gridh WITH 1,;
- newfile.whentype WITH 1,;
- newfile.validtype WITH 1,;
- newfile.showtype WITH 1,;
- newfile.activtype WITH 1,;
- newfile.deacttype WITH 1,;
- newfile.proctype WITH 1,;
- newfile.setuptype WITH 1,;
- newfile.float WITH .T.,;
- newfile.close WITH .T.,;
- newfile.border WITH 4,;
- newfile.center WITH .T.,;
- newfile.minimize WITH .T.,;
- newfile.scheme WITH 8,;
- newfile.scheme2 WITH 9,;
- newfile.deactivate WITH "CLEAR READ" + C_CRLF,;
- newfile.setupcode WITH "PUSH KEY" + C_CRLF + ;
- "ON KEY LABEL PGUP DO dopgup" + C_CRLF + ;
- "ON KEY LABEL PGDN DO dopgdn" + C_CRLF + ;
- "ON KEY LABEL CTRL+PGUP DO ctlpgup" + C_CRLF + ;
- "ON KEY LABEL CTRL+PGDN DO ctlpgdn" + C_CRLF + ;
- "IF EOF()" + C_CRLF + ;
- " GO BOTTOM" + C_CRLF + ;
- "ENDIF" + C_CRLF
- *- Append navigation code & alert screen from
- *- file included in project (01/27/94 JD)
- APPEND MEMO newfile.proccode FROM mignavpr.txt OVERWRITE
- CASE m.filetype = frm_type
- IF FILE(m.cpathname + m.rootname+".FRX") AND NOT ok2nuke(m.cpathname + m.rootname+".FRX")
- =FCLOSE(m.fhandle)
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
- m.targetname = m.cpathname + m.rootname + ".FRX"
- SELECT SELECT(1)
- CREATE DBF (m.targetname) ;
- ( platform c(8), ;
- uniqueid c(10), ;
- timestamp n(10), ;
- objtype n(2), ;
- objcode n(3), ;
- name m, ;
- expr m, ;
- vpos n(9,3), ;
- hpos n(9,3), ;
- height n(9,3), ;
- width n(9,3), ;
- style m, ;
- picture m, ;
- order m, ;
- "unique" l, ;
- comment m, ;
- environ l, ;
- boxchar c(1), ;
- fillchar c(1), ;
- tag m, ;
- tag2 m, ;
- penred n(5), ;
- pengreen n(5), ;
- penblue n(5), ;
- fillred n(5), ;
- fillgreen n(5), ;
- fillblue n(5), ;
- pensize n(5), ;
- penpat n(5), ;
- fillpat n(5), ;
- fontface m, ;
- fontstyle n(3), ;
- fontsize n(3), ;
- mode n(3), ;
- ruler n(1), ;
- rulerlines n(1), ;
- grid l, ;
- gridv n(2), ;
- gridh n(2), ;
- float l, ;
- stretch l, ;
- stretchtop l, ;
- top l, ;
- bottom l, ;
- suptype n(1), ;
- suprest n(1), ;
- norepeat l, ;
- resetrpt n( 2), ;
- pagebreak l, ;
- colbreak l, ;
- resetpage l, ;
- general n(3), ;
- spacing n(3), ;
- double l, ;
- swapheader l, ;
- swapfooter l, ;
- ejectbefor l, ;
- ejectafter l, ;
- plain l, ;
- summary l, ;
- addalias l, ;
- offset n(3), ;
- topmargin n(3), ;
- botmargin n(3), ;
- totaltype n(2), ;
- resettotal n(2), ;
- resoid n(3), ;
- curpos l, ;
- supalways l, ;
- supovflow l, ;
- suprpcol n(1), ;
- supgroup n(2), ;
- supvalchng l, ;
- supexpr m ;
- )
-
- USE (m.targetname) ALIAS newfile
- APPEND BLANK
- REPLACE newfile.objtype WITH 1, ;
- newfile.objcode WITH 53 && Header record.
- REPLACE newfile.height WITH 66 && _plength in IV...
- APPEND BLANK
- REPLACE objtype WITH 21 && Means there is an Intro (title) band??
- CASE m.filetype = lbl_type
- IF FILE(m.cpathname + m.rootname+".LBX") AND NOT ok2nuke(m.cpathname + m.rootname+".LBX")
- =FCLOSE(m.fhandle)
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
- m.targetname = m.cpathname + m.rootname + ".LBX"
- SELECT SELECT(1)
- create dbf (m.targetname) ;
- ( platform c(8), ;
- uniqueid c(10), ;
- timestamp n(10), ;
- objtype n(2), ;
- objcode n(3), ;
- name m, ;
- expr m, ;
- vpos n(9,3), ;
- hpos n(9,3), ;
- height n(9,3), ;
- width n(9,3), ;
- style m, ;
- picture m, ;
- order m, ;
- "unique" l, ;
- comment m, ;
- environ l, ;
- boxchar c(1), ;
- fillchar c(1), ;
- tag m, ;
- tag2 m, ;
- penred n(5), ;
- pengreen n(5), ;
- penblue n(5), ;
- fillred n(5), ;
- fillgreen n(5), ;
- fillblue n(5), ;
- pensize n(5), ;
- penpat n(5), ;
- fillpat n(5), ;
- fontface m, ;
- fontstyle n(3), ;
- fontsize n(3), ;
- mode n(3), ;
- ruler n(1), ;
- rulerlines n(1), ;
- grid l, ;
- gridv n(2), ;
- gridh n(2), ;
- float l, ;
- stretch l, ;
- stretchtop l, ;
- top l, ;
- bottom l, ;
- suptype n(1), ;
- suprest n(1), ;
- norepeat l, ;
- resetrpt n( 2), ;
- pagebreak l, ;
- colbreak l, ;
- resetpage l, ;
- general n(3), ;
- spacing n(3), ;
- double l, ;
- swapheader l, ;
- swapfooter l, ;
- ejectbefor l, ;
- ejectafter l, ;
- plain l, ;
- summary l, ;
- addalias l, ;
- offset n(3), ;
- topmargin n(3), ;
- botmargin n(3), ;
- totaltype n(2), ;
- resettotal n(2), ;
- resoid n(3), ;
- curpos l, ;
- supalways l, ;
- supovflow l, ;
- suprpcol n(1), ;
- supgroup n(2), ;
- supvalchng l, ;
- supexpr m ;
- )
- USE (m.targetname) ALIAS newfile
- SELECT SELECT(1)
- PRIVATE m.tempname
- m.tempname = SYS(3)
- CREATE DBF (m.tempname) ;
- ( expr c(254), ;
- vpos n( 3), ;
- hpos n( 3), ;
- width n( 3) ;
- )
- USE (m.tempname) ALIAS tempdbf
- SELECT newfile
- APPEND BLANK
- REPLACE newfile.objtype WITH 30
- ENDCASE
- PRIVATE isrecnofld
- isrecnofld = .F.
-
- gOTherm.Update(0)
-
- =FSEEK(m.fhandle,1,1) && Skip 1 byte. (Page heading flag.)
- PRIVATE m.numfields
- m.numfields = word2num(FREAD(m.fhandle,2))
- DO CASE
- CASE m.filetype = scr_type && If screen,
- =FSEEK(m.fhandle,40,1) && skip 40 bytes.
- REPLACE newfile.height WITH 25 && Height in file seems incorrect...
- CASE m.filetype = frm_type && If report,
- =FSEEK(m.fhandle,40,1) && skip 12 bytes (reserved).
- ** RF tempnote: num fields, band ids, here...needed???
- CASE m.filetype = lbl_type && If label,
- =FSEEK(m.fhandle,24,1) && skip 24 bytes.
- HEIGHT = word2num(FREAD(m.fhandle,2))
- REPLACE newfile.width WITH word2num(FREAD(m.fhandle,2)), ;
- newfile.hpos WITH word2num(FREAD(m.fhandle,2)), ;
- newfile.height WITH word2num(FREAD(m.fhandle,2)), ;
- newfile.penblue WITH word2num(FREAD(m.fhandle,2)), ;
- newfile.vpos WITH word2num(FREAD(m.fhandle,2))
- =FSEEK(m.fhandle,4,1)
- APPEND BLANK
- REPLACE newfile.objtype WITH 9, ;
- newfile.objcode WITH 4, ;
- newfile.height WITH m.height
- * Pro labels have exactly one record per line for contents.
- DO WHILE RECCOUNT() <= m.height + 1
- APPEND BLANK
- REPLACE newfile.objtype WITH 19
- ENDDO
-
- GOTO 1
- ENDCASE
- =readstring(m.fhandle) && Throw away print template name.
- IF _DOS
- *?" Internal name: " + readstring(m.fhandle)
- *?
- =readstring(m.fhandle)
- ELSE
- =readstring(m.fhandle)
- ENDIF
- GO TOP
- REPLACE comment WITH readstring(m.fhandle)
- PRIVATE linecount
- * ID bytes in band descriptor
- #DEFINE page_header_iv 0
- #DEFINE report_intro_iv 1
- #DEFINE group_intro_iv 2
- #DEFINE detail_iv 3
- #DEFINE group_summary_iv 4
- #DEFINE report_summary_iv 5
- #DEFINE page_footer_iv 6
-
-
- #DEFINE named_calc_variable 98
- * Traverse band descriptors.
-
- PRIVATE band_type, whicheditr, group_type, num_recs, group_expr, kludgename
- FOR m.bandnum = 1 TO num_bands
- IF m.filetype <> frm_type
- =FSEEK(m.fhandle,44,1) && Skip 44 bytes.
- =readstring(m.fhandle) && Throw away "field to group by."
- =readstring(m.fhandle) && Throw away "group by" expr.
- LOOP && Only hits here once anyway...
- ENDIF
- =FSEEK(m.fhandle,12,1) && Skip 12 bytes (reserved)
- band_type = ASC(FREAD(m.fhandle,1))
- GO BOTTOM
- IF newfile.objtype = named_calc_variable
- DO WHILE newfile.objtype = named_calc_variable
- SKIP -1
- ENDDO
- SKIP 1
- INSERT BLANK BEFORE
- ELSE
- APPEND BLANK
- ENDIF
- REPLACE newfile.objtype WITH 9
- DO CASE
- CASE m.band_type = page_header_iv
- REPLACE newfile.objcode WITH 1
- CASE m.band_type = report_intro_iv
- REPLACE newfile.objcode WITH 0
- CASE m.band_type = detail_iv
- REPLACE newfile.objcode WITH 4
- CASE m.band_type = page_footer_iv
- REPLACE newfile.objcode WITH 7
- CASE m.band_type = report_summary_iv
- REPLACE newfile.objcode WITH 8
- OTHERWISE
- IF m.bandnum < CEILING(num_bands/2)
- REPLACE objcode WITH 3 && Pre-detail group band.
- ELSE
- REPLACE objcode WITH 5 && Post-detail group band.
- ENDIF
- ENDCASE
- =FSEEK(m.fhandle,1,1) && Toss group # for now.
- m.whicheditr = ASC(FREAD(m.fhandle,1))
- IF m.whicheditr = 1
- REPLACE newfile.comment WITH "Converted dBASE IV WordWrap band."
- ENDIF
- =FSEEK(m.fhandle,8,1) && Skip 8 bytes (reserved).
- PRIVATE m.isopen
- m.isopen = IIF(ASC(FREAD(m.fhandle,1)) = 1, .T., .F.)
- m.group_type = ASC(FREAD(m.fhandle,1)) && 0=field,3=records, otherwise
- && expr datatype (N/L/C/F/D/N).
- =FSEEK(m.fhandle,4,1) && Skip 4 bytes ("spare").
- m.num_recs = word2num(FREAD(m.fhandle,2))
- =FSEEK(m.fhandle,4,1) && Skip 4 bytes ("reserved").
- PRIVATE eachpage, newpage
- m.eachpage = ASC(FREAD(m.fhandle,1))
- m.newpage = ASC(FREAD(m.fhandle,1))
- IF m.eachpage = 0
- REPLACE newfile.norepeat WITH .T.
- ENDIF
- IF m.newpage = 1
- REPLACE newfile.pagebreak WITH .T.
- ENDIF
- =FSEEK(m.fhandle,2,1) && Skip 2 bytes (pitch/quality).
- REPLACE newfile.objtype WITH 9
- m.linecount = word2num(FREAD(m.fhandle,2))
- IF m.filetype = frm_type
- REPLACE newfile.height WITH IIF(m.isopen,MAX(m.linecount,1),0)
- ENDIF
- =FSEEK(m.fhandle,1,1) && Skip band spacing.
- =word2num(FREAD(m.fhandle,2)) && Throw away band size (get later).
-
- group_expr = readstring(m.fhandle) && Field to group on.
- IF m.group_type < 3
- REPLACE newfile.expr WITH m.group_expr
- ENDIF
- group_expr = readstring(m.fhandle) && Expr to group on.
- IF m.group_type > 1
- IF m.group_type = 3 && Group by record count.
- kludgename = "_bandrec" + LTRIM(STR(m.bandnum))
- REPLACE newfile.expr WITH kludgename, ;
- newfile.norepeat WITH .T. &&???
-
- isrecnofld = .T.
- APPEND BLANK
- REPLACE newfile.objtype WITH named_calc_variable, ;
- newfile.objcode WITH 0, ;
- newfile.name WITH UPPER(kludgename), ;
- newfile.expr WITH ;
- "iif(mod(reccnt," + LTRIM(STR(m.num_recs)) + ") = 0," + ;
- "iif("+kludgename +"=1,0,1),"+kludgename+")", ;
- newfile.tag WITH "0", ;
- unique WITH .T.
- ELSE
- REPLACE newfile.expr WITH m.group_expr
- ENDIF
- ENDIF
- ENDFOR
-
- * Next, step through "fields" (anything but text).
- PRIVATE fieldname, datatype, fieldtype, fieldpic, fieldpfunc,;
- calias, naliaspos
-
- #DEFINE dbftype 0
- #DEFINE calctype 1
- #DEFINE summarytype 2 && Shouldn't be needed!
- #DEFINE predeftype 3
- #DEFINE memvartype 4
-
- DECLARE avline[256,4] && keep track of vertical lines: for each col, 1 = start, 2 = end, 3 = colorpr, 4 = single?
- STORE -1 TO avline
-
- PRIVATE workareas
- DECLARE workareas[25]
- FOR m.fieldnum = 1 TO m.numfields
- IF FEOF(m.fhandle)
- *- EOF has been reached prematurely, so bail out (2/23/94)
- EXIT
- ENDIF
- gOTherm.Update(m.fieldnum/m.numfields * 100)
- DO CASE
- CASE m.filetype = frm_type
- APPEND BLANK
- REPLACE newfile.height WITH 1, ;
- newfile.objtype WITH 8, ;
- newfile.objcode WITH 0
- CASE m.filetype = scr_type
- APPEND BLANK
- REPLACE newfile.height WITH 1, ;
- newfile.refresh WITH .F.,;
- newfile.objcode WITH 1, ;
- newfile.objtype WITH 15
- CASE m.filetype = lbl_type
- SELECT tempdbf
- APPEND BLANK
- SELECT newfile
- ENDCASE
- =FSEEK(m.fhandle,5,1) && Skip 5 bytes.
- fieldname = xtrim(FREAD(m.fhandle,11))
- IF "QBE__" $ fieldname
- *- strip off alias, since we assume it refers to a temp
- *- file from a DB4 query (01/27/94 jd)
- *- determine alias name
- m.naliaspos = AT("QBE__",fieldname)
- m.calias = SUBS(fieldname,m.naliaspos,AT(".",SUBS(fieldname,m.naliaspos)))
- m.fieldname = STRTRAN(fieldname,m.calias,"")
- ENDIF
- fieldtype = ASC(FREAD(m.fhandle,1))
- datatype = FREAD(m.fhandle,1)
- =FSEEK(m.fhandle,12,1) && Skip reserved bytes.
- WIDTH = ASC(FREAD(m.fhandle,1))
- PRIVATE supprepeat, ishidden
- supprepeat = IIF(ASC(FREAD(m.fhandle,1)) = 1, .T., .F.)
- ishidden = IIF(ASC(FREAD(m.fhandle,1)) = 1, .T., .F.)
- DO CASE
- CASE m.filetype = scr_type
- REPLACE newfile.width WITH m.width, ;
- newfile.fillchar WITH IIF(m.datatype = "F", "N", m.datatype)
-
- CASE m.filetype = frm_type
- REPLACE newfile.width WITH m.width, ;
- newfile.norepeat WITH m.supprepeat, ;
- newfile.fillchar WITH IIF(m.datatype = "F", "N", m.datatype)
- CASE m.filetype = lbl_type
- REPLACE tempdbf.width WITH m.width
- ENDCASE
- IF m.fieldtype = summarytype
- PRIVATE summ_field
- summ_field = xtrim(FREAD(m.fhandle,11))
- =FSEEK(m.fhandle,4,1) && Reserved.
- PRIVATE summ_op
- #DEFINE summ_avg_iv 0
- #DEFINE summ_cnt_iv 1
- #DEFINE summ_max_iv 2
- #DEFINE summ_min_iv 3
- #DEFINE summ_sum_iv 4
- #DEFINE summ_std_iv 5
- #DEFINE summ_var_iv 6
-
- summ_op = ASC(FREAD(m.fhandle,1))
- #DEFINE reset_never 0
- #DEFINE reset_page 1
- #DEFINE reset_group 2
- PRIVATE reset_when
- reset_when = ASC(FREAD(m.fhandle,1))
- =FSEEK(m.fhandle,73,1) && Rest of ext. info.
- ELSE
- PRIVATE predeftyp
- predeftyp = ASC(FREAD(m.fhandle,1))
- PRIVATE dbfname
- dbfname = CHR(m.predeftyp) + xtrim(FREAD(m.fhandle,80))
- =FSEEK(m.fhandle,9,1) && Last 9 of ext. info.
- ENDIF
- IF m.fieldtype = dbftype
- dbfname = xtrim(JustFName(m.dbfname))
- IF ASCAN(workareas, m.dbfname) = 0
- workareas[ascan(workareas, .F.)] = m.dbfname
- ENDIF
- IF !("QBE__" $ m.dbfname)
- *- ignore alias if from a DB4 query temp file name
- fieldname = m.dbfname + "." + m.fieldname
- ENDIF
- ENDIF
- =FSEEK(m.fhandle,4,1) && Reserved.
- fieldpict = readstring(m.fhandle)
- fieldpfunc = readstring(m.fhandle)
- IF "V"$m.fieldpfunc AND m.filetype = frm_type
- fieldpfunc = STRTRAN(m.fieldpfunc,"V","")
- REPLACE newfile.stretch WITH .T.
- ENDIF
- pict_func = ""
- IF "" <> m.fieldpfunc
- pict_func = "@" + m.fieldpfunc
- ENDIF
- IF "" <> m.fieldpict
- IF "" <> m.pict_func
- pict_func = m.pict_func + " "
- ENDIF
- pict_func = m.pict_func + m.fieldpict
- ENDIF
- IF "" <> m.pict_func AND TYPE("newfile.picture") <> "U"
- REPLACE newfile.picture WITH '"' + m.pict_func + '"'
- ENDIF
- PRIVATE delimiter1, delimiter2
- DO CASE
- CASE m.datatype = "D"
- delimiter1 = "{"
- delimiter2 = "}"
- CASE m.datatype = "C"
- delimiter1 = '"'
- delimiter2 = '"'
- CASE m.datatype = "M"
- REPLACE newfile.picture WITH ""
- * ProWin 2.5 rel. 1 bug: no pictures on memos!
- OTHERWISE
- delimiter1 = ""
- delimiter2 = ""
- ENDCASE
- DO CASE
- CASE m.fieldtype = dbftype OR m.fieldtype = memvartype
- DO CASE
- CASE m.filetype = scr_type
- isedit = (ASC(FREAD(m.fhandle,1)) <> 0)
- IF m.isedit
- REPLACE newfile.name WITH m.fieldname
- ELSE
- REPLACE newfile.expr WITH m.fieldname, ;
- newfile.refresh WITH .T., ;
- newfile.objcode WITH 0
- ENDIF
- =FSEEK(m.fhandle,1,1) && Skip carry flag.(??)
- REPLACE newfile.rangelo WITH readstring(m.fhandle), ;
- newfile.rangehi WITH readstring(m.fhandle), ;
- newfile.initialval WITH readstring(m.fhandle), ;
- newfile.when WITH readstring(m.fhandle), ;
- newfile.valid WITH readstring(m.fhandle), ;
- newfile.error WITH readstring(m.fhandle), ;
- newfile.message WITH readstring(m.fhandle)
-
- * Brute force method here, Q&D but should work.
- IF "" <> newfile.rangelo AND LEFT(newfile.rangelo,1) <> m.delimiter1
- REPLACE newfile.rangelo WITH m.delimiter1 + ;
- newfile.rangelo + m.delimiter2
- ENDIF
- IF "" <> newfile.rangehi AND LEFT(newfile.rangehi,1) <> m.delimiter1
- REPLACE newfile.rangehi WITH m.delimiter1 + ;
- newfile.rangehi + m.delimiter2
- ENDIF
- IF "" <> newfile.message
- REPLACE newfile.message WITH '"' + ;
- newfile.message + '"'
- ENDIF
- IF "" <> newfile.error
- REPLACE newfile.error WITH '"' + newfile.error + '"'
- ENDIF
-
- choicelist = readstring(m.fhandle)
- IF LEN(m.choicelist) > 0
- REPLACE newfile.picture WITH '"@M '+choicelist+'"'
- * Overrides any previous picture and/or function.
- ENDIF
- scrolwidth=word2num(FREAD(m.fhandle,2))
- IF m.scrolwidth > 0
- IF AT('S',newfile.picture) > 0
- REPLACE newfile.picture WITH ;
- LEFT(newfile.picture,AT('S',newfile.picture)) + ;
- LTRIM(STR(m.scrolwidth)) + ;
- SUBSTR(newfile.picture,AT('S',newfile.picture)+1)
- ENDIF
- ENDIF
- CASE m.filetype = frm_type
- REPLACE newfile.expr WITH m.fieldname
- CASE m.filetype = lbl_type
- REPLACE tempdbf.expr WITH m.fieldname
- ENDCASE
-
- CASE m.fieldtype = calctype
- IF m.filetype = scr_type
- REPLACE newfile.objtype WITH 15, newfile.objcode WITH 0
- ENDIF
- IF TYPE("newfile.comment") <> "U"
- REPLACE newfile.comment WITH newfile.comment + ;
- readstring(m.fhandle)
- ELSE
- =readstring(m.fhandle)
- ENDIF
- exprvar = readstring(m.fhandle)
- IF "QBE__" $ exprvar
- *- strip off alias, since we assume it refers to a temp
- *- file from a DB4 query (01/27/94 jd)
- *- determine alias name
- m.naliaspos = AT("QBE__",exprvar )
- m.calias = SUBS(exprvar ,m.naliaspos,AT(".",SUBS(exprvar ,m.naliaspos)))
- m.exprvar = STRTRAN(exprvar ,m.calias,"")
- ENDIF
- DO CASE
- CASE m.filetype = lbl_type
- REPLACE tempdbf.expr WITH m.exprvar
- CASE m.filetype = scr_type
- REPLACE newfile.expr WITH m.exprvar
- CASE m.filetype = frm_type
- IF "" = m.fieldname
- REPLACE newfile.expr WITH m.exprvar
- * Just a dynamically updated expression.
- ELSE
- REPLACE newfile.expr WITH m.fieldname
- * Create report variable.
- IF m.ishidden
- REPLACE newfile.objtype WITH 18, ;
- newfile.name WITH m.fieldname, ;
- newfile.expr WITH m.exprvar, ;
- newfile.tag WITH "0"
- ELSE
- APPEND BLANK
- REPLACE newfile.objtype WITH named_calc_variable, ;
- newfile.name WITH m.fieldname, ;
- newfile.expr WITH m.exprvar, ;
- newfile.tag WITH "0"
- SKIP -1
- ENDIF
- ENDIF
- ENDCASE
-
- CASE m.fieldtype = summarytype
- * replace summary with .t. &&????????? Nahhh....
-
- #DEFINE summ_cnt_pro 1
- #DEFINE summ_sum_pro 2
- #DEFINE summ_avg_pro 3
- #DEFINE summ_min_pro 4
- #DEFINE summ_max_pro 5
- #DEFINE summ_std_pro 6
- #DEFINE summ_var_pro 7
- IF "" = m.fieldname
- REPLACE newfile.expr WITH m.summ_field
- * Just a dynamically updated expression.
- ELSE
- REPLACE newfile.expr WITH m.fieldname
- * Create report variable.
- IF m.ishidden
- REPLACE newfile.objtype WITH 18, ;
- newfile.name WITH m.fieldname, ;
- newfile.expr WITH m.summ_field, ;
- newfile.tag WITH "0"
- ELSE
- APPEND BLANK
- REPLACE newfile.objtype WITH named_calc_variable, ;
- newfile.name WITH m.fieldname, ;
- newfile.expr WITH m.summ_field, ;
- newfile.tag WITH "0"
- * skip -1
- ENDIF
- ENDIF
- * replace newfile.expr with m.summ_field
- DO CASE
- CASE m.summ_op = summ_cnt_iv
- REPLACE newfile.totaltype WITH summ_cnt_pro
- REPLACE newfile.expr WITH "1" && (?!)
- CASE m.summ_op = summ_sum_iv
- REPLACE newfile.totaltype WITH summ_sum_pro
- CASE m.summ_op = summ_avg_iv
- REPLACE newfile.totaltype WITH summ_avg_pro
- CASE m.summ_op = summ_min_iv
- REPLACE newfile.totaltype WITH summ_min_pro
- CASE m.summ_op = summ_max_iv
- REPLACE newfile.totaltype WITH summ_max_pro
- CASE m.summ_op = summ_std_iv
- REPLACE newfile.totaltype WITH summ_std_pro
- CASE m.summ_op = summ_var_iv
- REPLACE newfile.totaltype WITH summ_var_pro
- ENDCASE
- IF TYPE("newfile.comment") <> "U"
- REPLACE newfile.comment WITH readstring(m.fhandle)
- ELSE
- =readstring(m.fhandle) && Toss description.
- ENDIF
- PRIVATE band_id
- band_id = word2num(FREAD(m.fhandle,2))
- IF m.reset_when < reset_group
- REPLACE newfile.resettotal WITH m.reset_when
- ELSE
- REPLACE newfile.resettotal WITH m.band_id
- *** Is this always right? Better be...
- ENDIF
- IF "" <> m.fieldname AND NOT m.ishidden
- SKIP -1 && Necessary?
- ENDIF
- =FSEEK(m.fhandle,2,1) && Toss hiword/bandID.
- CASE m.fieldtype = predeftype
- DO CASE
- CASE m.predeftyp = 0
- m.fieldname = "DATE()"
- CASE m.predeftyp = 1
- m.fieldname = "TIME()"
- CASE m.predeftyp = 2
- IF m.filetype = frm_type
- * fieldname = "'converted RECNO field'"
- ELSE
- fieldname = "RECNO()"
- ENDIF
- CASE m.predeftyp = 3
- fieldname = "_pageno"
- ENDCASE
- DO CASE
- CASE m.filetype = scr_type
- REPLACE newfile.objtype WITH 15, newfile.objcode WITH 0
- REPLACE newfile.expr WITH m.fieldname
- CASE m.filetype = frm_type
- REPLACE newfile.objtype WITH 8, newfile.objcode WITH 0
- IF m.predeftyp = 2
- REPLACE newfile.expr WITH "'converted RECNO field'"
- REPLACE totaltype WITH 1 && Count
- ELSE
- REPLACE newfile.expr WITH m.fieldname
- ENDIF
- CASE m.filetype = lbl_type
- REPLACE tempdbf.expr WITH m.fieldname
- ENDCASE
- ENDCASE
- * Handle concatenation of label fields on one line
- * by making everything alpha.
- *IF m.filetype = lbl_type AND m.datatype <> "C" ;
- * AND "" <> ALLTRIM(tempdbf.expr)
- *- removed test for datatype, since we want to migrate all picture clauses? (jd 6/23/94)
- IF m.filetype = lbl_type AND "" <> ALLTRIM(tempdbf.expr)
- REPLACE tempdbf.expr WITH "TRANSFORM(" + TRIM(tempdbf.expr) ;
- + ',"' + pict_func + '")'
- ENDIF
- ENDFOR
-
- *- under certain condtions, EOF will have been
- *- reached prematurely, so skip rest of file processing in that case (2/22/94)
- IF !FEOF(m.fhandle)
- PRIVATE gl_ruler, bookmark
- gl_ruler = FREAD(m.fhandle,68)
- IF m.filetype = frm_type
- bookmark = RECNO()
- GOTO TOP
- REPLACE newfile.width WITH word2num(SUBSTR(m.gl_ruler,5,2)) + 1
- GOTO m.bookmark
- ENDIF
-
- PRIVATE bandmessg
- FOR m.bandnum = 1 TO num_bands
- bandmessg = dump_band(m.bandnum)
- IF m.bandmessg <> "OK"
- =falldown(bandmessg)
- SET EXACT &oldexact
- RETURN .F.
- ENDIF
- ENDFOR
- ENDIF && !FEOF(m.fhandle)
-
- *- resolve any lingering vertical lines
- =FixVert(@avline)
- gOTherm.Update(.98)
- IF m.isrecnofld && Reports only.
- APPEND BLANK
- *** CHECK IT OUT! .NAME below MUST be upper case!
- REPLACE newfile.objtype WITH named_calc_variable, ;
- newfile.objcode WITH 0, ;
- newfile.name WITH "RECCNT", ;
- newfile.expr WITH "reccnt", ;
- newfile.tag WITH "0" ;
- newfile.unique WITH .T., ;
- newfile.totaltype WITH 1 && (count)
- ENDIF
- =FCLOSE(m.fhandle)
- PRIVATE warea
- FOR warea = 1 TO 25
- IF TYPE("workareas[m.warea]") = "L"
- EXIT
- ENDIF
- IF LEFT(workareas[m.warea],5) = "QBE__"
- *- assume a temp file from a DB4 query, so ignore (01/27/94 jd)
- LOOP
- ENDIF
- APPEND BLANK
- REPLACE newfile.objtype WITH 2, ;
- newfile.objcode WITH m.warea, ;
- newfile.name WITH workareas[m.warea]+".DBF", ;
- newfile.tag WITH workareas[m.warea]
- ENDFOR
- IF m.warea > 1
- GOTO TOP
- REPLACE newfile.environ WITH .T.
- ENDIF
- REPLACE ALL newfile.platform WITH "DOS", newfile.uniqueid WITH SYS(2015)
- DO CASE
- CASE m.filetype = scr_type
- PRIVATE scrheight,m.nmaxwidth, m.nmaxheight
- GO TOP
- scrheight = newfile.height
- SCAN
- scrheight = MAX(m.scrheight, newfile.vpos + newfile.height)
- ENDSCAN
- GO TOP
- REPLACE newfile.height WITH m.scrheight
- SORT ON vpos, hpos TO (m.targetname)
- USE (m.targetname)
- CALCULATE MAX(hpos + width),MAX(vpos + height) FOR RECNO() > 1 ;
- TO m.nmaxwidth, m.nmaxheight
- GO TOP
- REPLACE width WITH MAX(width,m.nmaxwidth + 2),;
- height WITH MAX(height,m.nmaxheight + 2)
- USE
- DELETE FILE &tempname..dbf
- DELETE FILE &tempname..fpt &&added by bobfor
- =CPTAG(m.targetname,CPCURRENT(2))
- CASE m.filetype = lbl_type
- SELECT tempdbf
- USE
- DELETE FILE &tempname..dbf
- SELECT newfile
- GOTO 3
- SCAN WHILE .NOT. EOF()
- REPLACE newfile.width WITH 0
- ENDSCAN
- USE
- =CPTAG(m.targetname,CPCURRENT(2))
- CASE m.filetype = frm_type
- SELECT newfile
- REPLACE ALL objtype WITH 18 FOR newfile.objtype = named_calc_variable
-
- * Now get tricky and find empty open bands, make sure they print.
- PRIVATE bandheight, hasobjects
- GO TOP
- LOCATE FOR objtype = 9 && Find first band.
- bandstart = 0
- SCAN WHILE newfile.objtype = 9
- IF newfile.height = 0
- bandstart = m.bandstart + 1
- LOOP
- ENDIF
- bookmark = RECNO()
- hasobjects = .F.
- bandheight = newfile.height
- SCAN REST
- IF newfile.vpos >= m.bandstart AND newfile.vpos < (m.bandstart + m.bandheight)
- hasobjects = .T.
- EXIT
- ENDIF
- ENDSCAN
- IF !m.hasobjects
- APPEND BLANK
- REPLACE newfile.objtype WITH 5, ;
- newfile.objcode WITH 0, ;
- newfile.height WITH 1, ;
- newfile.width WITH 1, ;
- newfile.expr WITH '" "' ;
- newfile.vpos WITH m.bandstart, ;
- newfile.hpos WITH 0, ;
- newfile.uniqueid WITH SYS(2015), ;
- newfile.platform WITH "DOS"
- ENDIF
- GOTO m.bookmark
- bandstart = m.bandstart + newfile.height
- ENDSCAN
- * Now replace all "closed" band sizes with 1 so they show on surface.
- REPLACE ALL newfile.height WITH 1 FOR newfile.height = 0
-
- * Hokay, now make sure that all of the object in the report
- * fit in the margins.
- PRIVATE repwidth
- GOTO TOP
- repwidth = newfile.width
- LOCATE FOR newfile.objtype = 9
- SCAN WHILE newfile.objtype = 9
- ENDSCAN
- SCAN WHILE .NOT. EOF()
- repwidth = MAX(m.repwidth, newfile.hpos + newfile.width)
- ENDSCAN
- GO TOP
- REPLACE newfile.width WITH m.repwidth
- USE
- =CPTAG(m.targetname,CPCURRENT(2))
- ENDCASE
-
- gOTherm.Complete
-
- USE
- SET EXACT &oldexact.
- IF "" <> oldalias
- SELECT (oldalias)
- ENDIF
- RETURN .T.
-
- ******************
- FUNCTION dump_band && Call funcs to dump wordwrap or layout band.
- PARAMETER bandnum
- PRIVATE bandstart && Starting row of band on display, used in both band dumps.
- bandstart = 0
- IF m.filetype <> scr_type
- GOTO 3
- SCAN WHILE newfile.objtype = 9 AND RECNO() < m.bandnum + 2
- bandstart = m.bandstart + MAX(newfile.height,1)
- ENDSCAN
- ENDIF
- IF m.filetype = frm_type
- GOTO m.bandnum + 2
- IF "WORDWRAP" $ UPPER(newfile.comment)
- RETURN dmprapband(m.bandnum)
- ENDIF
- ENDIF
- RETURN dumplayout(m.bandnum)
-
- *******************
- FUNCTION dmprapband && No not Vanilla Ice...
- PARAMETER bandnum
-
- PRIVATE bandsize
- bandsize = word2num(FREAD(m.fhandle,2))
- PRIVATE wholeband
- m.wholeband = FREAD(m.fhandle, m.bandsize)
- PRIVATE marker
- m.marker = 1
- PRIVATE paragraph, linetext, LINENO, linemark, fieldmark, COLUMN, fieldwidth
- PRIVATE lmargin, lindent
- LINENO = -1
- DO WHILE m.marker < m.bandsize
- LINENO = m.lineno + 1
- m.paragraph = SUBSTR(m.wholeband, m.marker)
- m.paragraph = LEFT(m.paragraph, AT(CHR(0), m.paragraph) - 1)
- m.marker = m.marker + LEN(m.paragraph) + 104
- m.lmargin = VAL(SUBSTR(m.wholeband,m.marker - 102,3))
- m.lindent = VAL(SUBSTR(m.wholeband,m.marker - 96,3))
- IF m.lindent = 0 AND SUBSTR(m.wholeband,m.marker - 95,2) <> " 0"
- IF SUBSTR(m.wholeband, m.marker - 95,1) <> " "
- lindent = (48-ASC(SUBSTR(m.wholeband,m.marker - 95,1))) * 10
- ENDIF
- m.lindent = m.lindent + 48 - ASC(SUBSTR(m.wholeband,m.marker - 94,1))
- m.lindent = 0 - m.lindent
- ENDIF
- COLUMN = m.lmargin + m.lindent
-
- DO WHILE LEN(m.paragraph) > 0
- m.linemark = AT(CHR(141)+CHR(10), m.paragraph)
- m.fieldmark = AT(CHR(1), m.paragraph)
- DO CASE
- CASE m.linemark > 0 AND (m.linemark < m.fieldmark OR m.fieldmark = 0)
- linetext = LEFT(m.paragraph, m.linemark - 1)
- paragraph = SUBSTR(m.paragraph, LEN(m.linetext) + 3)
- CASE m.fieldmark > 0 AND (m.fieldmark < m.linemark OR m.linemark = 0)
- linetext = LEFT(m.paragraph, m.fieldmark - 1)
- =gotofrmfld(VAL(SUBSTR(m.paragraph, LEN(m.linetext) + 3, 2)))
- REPLACE newfile.hpos WITH m.column + LEN(m.linetext), ;
- newfile.vpos WITH m.lineno + m.bandstart, ;
- newfile.float WITH .T.
-
- m.fieldwidth = newfile.width
- m.paragraph = SUBSTR(m.paragraph, LEN(m.linetext) + 12)
- OTHERWISE
- m.linetext = m.paragraph
- m.paragraph = ""
- ENDCASE
- APPEND BLANK
- REPLACE newfile.objtype WITH 5, ;
- newfile.objcode WITH 0, ;
- newfile.expr WITH '"' + m.linetext + '"' ;
- newfile.height WITH 1, ;
- newfile.width WITH LEN(m.linetext), ;
- newfile.vpos WITH m.lineno + m.bandstart, ;
- newfile.hpos WITH m.column, ;
- newfile.float WITH .T.
- IF m.linemark > 0 AND (m.linemark < m.fieldmark OR m.fieldmark = 0)
- m.lineno = m.lineno + 1
- ENDIF
- IF m.fieldmark > 0 AND (m.fieldmark < m.linemark OR m.linemark = 0)
- m.column = m.column + LEN(m.linetext) + m.fieldwidth
- ELSE
- m.column = m.lmargin
- ENDIF
- ENDDO
- ENDDO
- RETURN "OK"
-
- *******************
- FUNCTION gotofrmfld && Recno() + 2 + bands = field info but compensate
- && for Report Variable records (temptype=NAMED_CALC_VARIABLE).
- PARAMETER pseekrec
- PRIVATE seekrec
- seekrec = m.pseekrec
- GOTO 2 + m.num_bands
-
- SET FILTER TO newfile.objtype <> named_calc_variable
- * "Artificial" hidden fields.
-
- SKIP m.pseekrec
- SET FILTER TO
- RETURN m.pseekrec
-
- *******************
- FUNCTION dumplayout && Dump layout bands to FRX/LBX/SCX.
- PARAMETER bandnum
-
- PRIVATE bandsize
- bandsize = word2num(FREAD(m.fhandle,2))
- PRIVATE bandend
- bandend = FSEEK(m.fhandle,0,1) + bandsize
- bandversn = ASC(FREAD(m.fhandle,1))
- * Update header record.
- GOTO TOP
- IF m.filetype = frm_type
- =FSEEK(m.fhandle,2,1)
- ELSE
- REPLACE newfile.width WITH MAX(newfile.width,word2num(FREAD(m.fhandle,2)))
- ENDIF
- =FSEEK(m.fhandle,6,1) && Screens: skip max height (not there?)
- && and #rows (not max), numtextrows (not correct?)
-
- PRIVATE mrow && For labels, new row for field expr.
- PRIVATE mexp && For labels, transfer expr from "order".
- DO WHILE FREAD(m.fhandle,1) = "," && Constant spacer--starts each field.
- && (Should be "." if end of list.)
- gOTherm.Update(FSEEK(m.fhandle,0,1)/m.fsize * 100) && progress therm
- DO CASE
- CASE m.filetype = lbl_type
- GOTO word2num(FREAD(m.fhandle, 2)) IN tempdbf
- CASE m.filetype = frm_type
- =gotofrmfld(word2num(FREAD(m.fhandle,2)))
- CASE m.filetype = scr_type
- GOTO word2num(FREAD(m.fhandle, 2)) + 1
- ENDCASE
- IF m.bandversn = 4
- =FSEEK(m.fhandle,12,1)
- ENDIF
- IF m.filetype = scr_type OR m.filetype = frm_type
- IF EOF() && ...Pro skips next three reads, eerie.
- =FSEEK(m.fhandle,6,1)
- ELSE
- REPLACE newfile.vpos WITH word2num(FREAD(m.fhandle,2)), ;
- newfile.hpos WITH word2num(FREAD(m.fhandle,2)), ;
- newfile.width WITH word2num(FREAD(m.fhandle,2))
- IF m.filetype = frm_type
- REPLACE newfile.vpos WITH newfile.vpos + m.bandstart
- ENDIF
- ENDIF
- ELSE
- REPLACE tempdbf.vpos WITH word2num(FREAD(m.fhandle,2)), ;
- tempdbf.hpos WITH word2num(FREAD(m.fhandle,2)), ;
- tempdbf.width WITH word2num(FREAD(m.fhandle,2))
- ENDIF
- IF m.bandversn = 4
- =FSEEK(m.fhandle,4,1)
- ENDIF
- IF ASC(FREAD(m.fhandle,1)) <> 0 && Window flag.
- IF m.bandversn = 4
- =FSEEK(m.fhandle,8,1)
- ENDIF
- =FSEEK(m.fhandle,8,1) && Skip window frame.
- winfo = FREAD(m.fhandle,9)
- IF SUBSTR(m.winfo,9,1) <> CHR(0) && Open window memo.
- REPLACE newfile.objcode WITH 2 && "Edit" window.
- REPLACE newfile.hpos WITH word2num(SUBSTR(m.winfo,1,2)), ;
- newfile.vpos WITH word2num(SUBSTR(m.winfo,3,2)), ;
- newfile.width WITH word2num(SUBSTR(m.winfo,5,2)), ;
- newfile.scrollbar WITH .T., ;
- newfile.height WITH word2num(SUBSTR(m.winfo,7,2))
- ENDIF
- =FSEEK(m.fhandle,2,1) && Toss attribute for now...
- IF m.bandversn = 4
- =FSEEK(m.fhandle,3,1)
- ENDIF
- ENDIF
- ENDDO
-
- * Read the box(/line) descriptors. Method: read 19 bytes at
- * a time. When the first byte of the 19 is seen to be the list
- * terminator, rewind 18 that belong to the next section.
-
- PRIVATE m.boxdlength
- IF m.bandversn = 5
- m.boxdlength = 19
- ELSE
- m.boxdlength = 28
- ENDIF
- PRIVATE m.boxdescrpt
- m.boxdescrpt = FREAD(m.fhandle,m.boxdlength)
- DO WHILE LEFT(m.boxdescrpt, 1) = ","
- gOTherm.Update(FSEEK(m.fhandle,0,1)/m.fsize * 100) && progress therm
- IF m.filetype = lbl_type
- m.boxdescrpt = FREAD(m.fhandle,m.boxdlength)
- * Boxes/lines not supported in labels.
- LOOP
- ENDIF
- APPEND BLANK
- REPLACE newfile.objtype WITH 7
- IF m.bandversn = 4
- m.boxdescrpt = SUBSTR(m.boxdescrpt,9)
- ENDIF
- DO CASE
- CASE SUBSTR(m.boxdescrpt,2,1) = "═"
- REPLACE newfile.objcode WITH 5 && Double-line box
- CASE SUBSTR(m.boxdescrpt,2,1) = "─"
- REPLACE newfile.objcode WITH 4 && Single-line box
- OTHERWISE
- REPLACE newfile.objcode WITH 7 && Special-char box
- REPLACE newfile.boxchar WITH SUBSTR(m.boxdescrpt,2,1)
- ENDCASE
- REPLACE newfile.fillchar WITH CHR(0) && Make transparent.
- REPLACE newfile.hpos WITH word2num(SUBSTR(m.boxdescrpt,10,2)), ;
- newfile.vpos WITH word2num(SUBSTR(m.boxdescrpt,12,2)), ;
- newfile.width WITH word2num(SUBSTR(m.boxdescrpt,14,2)), ;
- newfile.height WITH word2num(SUBSTR(m.boxdescrpt,16,2))
- IF m.filetype = scr_type
- IF bandversn = 4
- REPLACE newfile.colorpair WITH ;
- bits2color(word2num(SUBSTR(m.boxdescrpt,19,2)))
- ELSE
- REPLACE newfile.colorpair WITH ;
- bits2color(word2num(SUBSTR(m.boxdescrpt,18,2)))
- ENDIF
- ENDIF
- IF m.filetype = frm_type
- REPLACE newfile.vpos WITH newfile.vpos + m.bandstart
- ENDIF
- m.boxdescrpt = FREAD(m.fhandle,m.boxdlength)
- ENDDO
-
- =FSEEK(m.fhandle,1-m.boxdlength,1) && Rewind, we read an extra box descriptor above.
-
- * Now get the text items, stepping through the layout band contents.
- * This involves some concatenation of label stuff since Fox only
- * allows one expression per line on labels.
-
- PRIVATE size_row, this_row, this_col, scanned, packed_row, ;
- value_type, textlength, VALUE, attr_change, bytesread
-
- this_row = 0
- bytesread = 0
- DO WHILE FSEEK(m.fhandle,0,1) < bandend && AND !FEOF(m.fhandle) && While bytes left in this band...
- gOTherm.Update(FSEEK(m.fhandle,0,1)/m.fsize * 100) && progress therm
- scanned = 0
- this_col = 0
- this_row = m.this_row + word2num(FREAD(m.fhandle, 2))
- size_row = word2num(FREAD(m.fhandle,2))
- IF size_row < 1
- LOOP
- ENDIF
- bytesread = m.bytesread + m.size_row
- packed_row = FREAD(m.fhandle, m.size_row)
- PRIVATE newcolor
- newcolor = ""
-
- * Flag values for tokens in a "text row."
- #DEFINE eorow 0
- #DEFINE skipcolumns 1
- #DEFINE k_field 2
- #DEFINE k_text 3
- #DEFINE styleattrib 4
- #DEFINE displattrib 5
- #DEFINE pagebreak 8
- PRIVATE newstyle
- newstyle = ""
- DO WHILE m.scanned < m.size_row - 1
- gOTherm.Update(FSEEK(m.fhandle,0,1)/m.fsize * 100) && progress therm
- scanned = m.scanned + 1
- value_type = ASC(SUBSTR(m.packed_row, m.scanned,1))
-
- m.value = SUBSTR(m.packed_row, m.scanned + 1)
- * May not be used, depends on value_type.
-
- DO CASE
- CASE m.value_type = eorow
- m.this_col = 0
- m.newstyle = ""
- CASE m.value_type = skipcolumns
- m.scanned = m.scanned + 1
- m.this_col = m.this_col + ASC(m.value)
- CASE m.value_type = k_field
- DO CASE
- CASE m.filetype = frm_type
- SCAN FOR newfile.objtype = 8 && fields
- IF newfile.vpos = m.this_row + m.bandstart AND ;
- newfile.hpos = m.this_col
- m.this_col = m.this_col + newfile.width
- EXIT
- ENDIF
- ENDSCAN
- CASE m.filetype = scr_type
- SCAN FOR newfile.objtype = 15 && fields
- IF newfile.vpos = m.this_row AND ;
- newfile.hpos = m.this_col
- m.this_col = m.this_col + newfile.width
- EXIT
- ENDIF
- ENDSCAN
- CASE m.filetype = lbl_type
- SELECT tempdbf
- SCAN
- IF tempdbf.vpos = m.this_row AND ;
- tempdbf.hpos = m.this_col
- SELECT newfile
- GOTO m.this_row + 3
- IF "" <> ALLTRIM(newfile.expr)
- REPLACE newfile.expr WITH ;
- ALLTRIM(newfile.expr) + '+'
- ENDIF
- IF newfile.width < m.this_col
- REPLACE newfile.expr WITH ;
- ALLTRIM(newfile.expr) + '"' + ;
- SPACE(m.this_col - newfile.width) +;
- '"+'
- ENDIF
- REPLACE newfile.expr WITH newfile.expr + ALLTRIM(tempdbf.expr)
- m.this_col = m.this_col + tempdbf.width
- REPLACE newfile.width WITH m.this_col
- EXIT
- ENDIF
- ENDSCAN
- SELECT newfile
- ENDCASE
-
- * newcolor = ""
- IF m.filetype = frm_type
- REPLACE newfile.style WITH m.newstyle
- ENDIF
- m.scanned = m.scanned + 4
- CASE m.value_type = k_text
- textlength = AT(CHR(0), m.value)
- IF m.filetype = scr_type OR m.filetype = frm_type
- APPEND BLANK
- REPLACE newfile.objtype WITH 5, ;
- newfile.objcode WITH 0, ;
- newfile.vpos WITH m.this_row, ;
- newfile.hpos WITH m.this_col ;
- newfile.height WITH 1, ;
- newfile.width WITH textlength - 1
- IF m.filetype = scr_type
- REPLACE newfile.colorpair WITH m.newcolor
- ELSE
- REPLACE newfile.vpos WITH newfile.vpos + m.bandstart
- ENDIF
- * newcolor = ""
- REPLACE newfile.expr WITH newfile.expr + '"' + ;
- LEFT(m.value,m.textlength-1) + '"'
- ELSE && labels
- GOTO m.this_row + 3
- VALUE = LEFT(m.value,textlength-1)
- IF "" <> ALLTRIM(newfile.expr)
- REPLACE newfile.expr WITH newfile.expr + ;
- '+'
- ENDIF
- IF newfile.width < m.this_col - 1
- VALUE = SPACE(m.this_col - newfile.width) ;
- + m.value
- * textlength = m.textlength + m.this_col - newfile.width
- ENDIF
- REPLACE newfile.expr WITH newfile.expr + '"' + ;
- m.value + '"'
- REPLACE newfile.width WITH m.this_col + LEN(m.value) &&textlength + 1
- ENDIF
- scanned = m.scanned + m.textlength
- this_col = m.this_col + m.textlength - 1
- IF m.filetype = frm_type
- REPLACE style WITH newstyle
- ENDIF
- *- Added by JD 12/29/93 -- check to see if text describes a line
- *- if so, convert to line type object!
- =cvtLine(@avline)
- CASE m.value_type = styleattrib
- newstyle = cvtstyle(word2num(LEFT(m.value, 2)))
- scanned = m.scanned + 2
- CASE m.value_type = displattrib
- scanned = m.scanned + 2
- newcolor = bits2color(word2num(LEFT(m.value, 2)))
- CASE m.value_type = pagebreak && N/A??
- * newstyle = ""
- OTHERWISE
- RETURN '"Text row" value type incorrect!'
- ENDCASE
- ENDDO
- ENDDO
- RETURN "OK"
-
-
- *****************
- FUNCTION falldown && Show error message and cancel.
- *****************
- PARAMETER m.pmessage
- IF !EMPTY(m.pmessage)
- =MESSAGEBOX(m.pmessage, 0 + 48, C_THERMTITLE_LOC)
- ENDIF
- =FCLOSE(m.fhandle)
- SET EXACT &oldexact.
- IF "" <> oldalias
- SELECT (oldalias)
- ENDIF
- IF TYPE("field(1,'newfile')") <> "U"
- SELECT newfile
- USE
- ENDIF
- IF TYPE("field(1,'tempdbf')") <> "U"
- SELECT tempdbf
- USE
- DELETE FILE &tempname..dbf
- DELETE FILE &tempname..fpt &&changed from .dbt by bobfor
- ENDIF
- IF TYPE("m.targetname") = "C" AND FILE(m.targetname)
- DELETE FILE &m.targetname.
- PRIVATE m.memoname
- DO CASE
- CASE m.filetype = frm_type
- m.memoname = STRTRAN(m.targetname,"FRX","FRT")
- CASE m.filetype = scr_type
- m.memoname = STRTRAN(m.targetname,"SCX","SCT")
- CASE m.filetype = lbl_type
- m.memoname = STRTRAN(m.targetname,"LBX","LBT")
- ENDCASE
- IF FILE(m.memoname)
- DELETE FILE &m.memoname.
- ENDIF
- ENDIF
- RETURN
- ENDFUNC
-
- *****************
- FUNCTION word2num && Convert 2-byte word to Pro-type number.
- PARAMETER bytes
- RETURN ASC(m.bytes) + ASC(SUBSTR(m.bytes,2,1)) * 256
-
- *******************
- FUNCTION readstring && Read a string formatted as 2-byte length + C-string.
- PARAMETER phandle
- PRIVATE m.strlength
- m.strlength = word2num(FREAD(m.phandle,2))
- IF m.strlength = 0
- RETURN ""
- ENDIF
- RETURN xtrim(FREAD(m.phandle, m.strlength))
-
- **************
- FUNCTION xtrim && Trim spaces and nulls.
- PARAMETER pstring
- PRIVATE pos
- m.pos = AT(CHR(0), m.pstring)
- IF m.pos > 0
- m.pstring = LEFT(pstring, m.pos-1)
- ELSE
- m.pos = LEN(m.pstring)
- DO WHILE m.pos > 1 AND ASC(RIGHT(m.pstring, 1)) = 0
- m.pstring = LEFT(m.pstring, LEN(m.pstring) - 1)
- m.pos = m.pos - 1
- ENDDO
- ENDIF
- IF m.pos = 1 AND ASC(m.pstring) = 0
- RETURN ""
- ENDIF
- RETURN ALLTRIM(m.pstring)
-
- *******************
- FUNCTION cvtstyle && Change 2-word IV style code to Pro style string.
- PARAMETER styleword
- PRIVATE m.retstring, stylesstring
- m.retstring = ""
- stylesstring = " BIURL"
- bitval = 2^8
- FOR bit = 9 TO 13
- IF isbitset(m.styleword, m.bitval)
- m.retstring = m.retstring + SUBSTR(m.stylesstring, m.bit, 1)
- ENDIF
- bitval = m.bitval * 2
- ENDFOR
- RETURN ALLTRIM(m.retstring)
-
- *******************
- FUNCTION bits2color && Change 2-word IV color code to Pro color text.
- *******************
- PARAMETER attrword
- #DEFINE defaultattr 32768 && If bit 15 set, use default attribute.
- PRIVATE m.retstring, colorstring
- m.retstring = ""
- colorstring = "BGR+BGR + U*"
- IF defaultattr = m.attrword
- RETURN ""
- ENDIF
- bitval = 1
- FOR bit = 1 TO 4
- IF isbitset(m.attrword, m.bitval)
- m.retstring = m.retstring + SUBSTR(m.colorstring, m.bit, 1)
- ENDIF
- bitval = m.bitval * 2
- ENDFOR
- IF "" = m.retstring
- m.retstring = "N"
- ENDIF
- m.retstring = m.retstring + "/"
- FOR bit = 5 TO 12
- IF isbitset(m.attrword, m.bitval)
- m.retstring = m.retstring + SUBSTR(m.colorstring, m.bit, 1)
- ENDIF
- bitval = m.bitval * 2
- ENDFOR
- RETURN STRTRAN(m.retstring,"BGR","W")
- ENDFUNC
-
- *****************
- FUNCTION isbitset
- *****************
- PARAMETERS bitfield, bitval
- IF MOD(m.bitfield, m.bitval*2) / m.bitval >= 1
- RETURN .T.
- ENDIF
- RETURN .F.
- ENDFUNC
-
- ****************
- FUNCTION ok2nuke
- ****************
- *- Emulate SAFETY ON
-
- PARAMETER filename
-
- PRIVATE m.nresult
-
- m.nresult = MESSAGEBOX(JustFName(UPPER(m.filename)) + C_OVERWRITE_LOC,4 + 32 + 256,C_THERMTITLE_LOC)
- *- fix return values (jd 6/24/94)
- RETURN (m.nresult = IDYES)
- ENDFUNC
-
- *- eof MIGDB4.PRG